﻿// Monthly Expense POJ - 3273.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3273

/*
农场主约翰是个惊人的会计奇才，他已经意识到经营农场的钱可能会用完。
他已经计算并记录了未来 N 天（1 ≤ N ≤ 100,000 天）每天需要花费的确切金额（1 ≤ moneyi ≤ 10,000）。

FJ 希望为一组顺序排列的 M 个（1 ≤ M ≤ N）财政期编制预算，这些财政期被称为 "fajomonths"。
每个 "fajomonths"都包含一组 1 天或 1 天以上的连续天数。每一天都正好包含在一个法月中。

FJ 的目标是安排这些法月，使支出最高的法月的支出最小，从而确定他的每月支出限额。

输入
第 1 行 两个空格分隔的整数： N 和 M
第 2...N+1 行： 第 i+1 行包含农场主约翰在第 i 天花费的美元数
输出
第 1 行： 农民约翰每月能承受的最小限额。
样本
输入复制 输出复制
7 5
100
400
300
100
500
101
400

500
提示
如果农场主约翰安排月份，使头两天是一个月，第三天和第四天是一个月，最后三天是最后的月份，
那么他在任何一个月中最多花费 500 美元。
任何其他的安排方法都会产生更大的每月最低限额。
*/


int n, m;
const int N = 100010;
int days[N];

bool check(int x) {
	int groupCnt = 1;
	int curr = 0;

	for (int i = 0; i < n; i++) {
		if (days[i] > x) return false;
		if (curr + days[i] <= x) {
			curr += days[i];
		}
		else {
			curr = days[i];
			groupCnt++;
		}
	}

	if (groupCnt <= m) return true;
	return false;
}

void solve() {
	int l = 0; int r = 1e9 + 10;
	while (l < r) {
		int mid = (l + r ) >> 1;
		if (check(mid)) {
			r = mid;
		}
		else {
			l = mid + 1;
		}
	}

	cout << l << endl;

}


int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> days[i];
	}
	solve();

	return 0;
}

 